<?php
declare (strict_types=1);

namespace app\adminapi\controller;

use Qiniu\Config;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
use think\Exception;
use think\exception\ValidateException;
use think\facade\Filesystem;
use think\Request;

/**
 * 文件上传有关接口
 * 图片、word、excel、pdf
 * Class File
 * @package app\adminapi\controller
 */
class File
{
    /**
     * 单文件上传
     */
    public function singleUpload(Request $request)
    {
        # 考虑异常情况
        try {
            # 添加验证规则、创建独立验证器、也可以在控制器里面进行验证、这个接口只能上传图片
//            上传的word
            $file = $request->file('file');
            $mimeType = $file->getMime();// 获取mimeType
            $extension = $file->extension();// 获取文件扩展名

            # 根据文件类型进行归类
            $imageType = [
                'image/jpeg',
                'image/jpeg',
                'image/png',
            ];
            switch ($mimeType){
                case in_array($mimeType,$imageType):
                    $path = Filesystem::disk('public')->putFile( 'image', $file);
                    break;
                case 'word':
                    $path = Filesystem::disk('public')->putFile( 'word', $file);
                    break;
//                    ...还有其他类型
                default :
                    $path = Filesystem::disk('public')->putFile( 'file', $file);
            }


            $data = [
                'path' => 'http://adminapi.pyg.com/storage/'.$path
            ];
            return success($data);
        }catch (ValidateException $validateException) {
            return fail($validateException->getMessage(),$validateException->getCode());
        }


    }

    /**
     * 多文件上传
     */
    public function multiUpload(Request $request){

//        有一部分异常信息遗漏、未知的异常、统一有异常接管类进行处理
//        HttpException抛出的异常信息
        # 手动捕获异常
//        try {
        // Exception抛出异常
            $files = $request->file('file');
//        }catch (Exception $exception) {
//            return  fail($exception->getCode(),$exception->getMessage());
//        }


        $paths = [];
        $errors = [];
        foreach ($files as $file) {
            try {
                # 循环进行文件上传
                validate(['file'=>'fileExt:jpg,png,jpeg,doc,docx'])
                    ->check(['file'=>$file]);
                $path = Filesystem::disk('public')->putFile( 'image', $file);
                $paths[] = 'http://adminapi.pyg.com/storage/'.$path;
            }catch (ValidateException $validateException) {
               $errors[] = [
                   'reason' => $validateException->getMessage(),
                   'name' => $file->getOriginalName()
               ];
            }
        }

        $data = [
            'path' => $paths,
            'errors' => $errors,
        ];

        return  success($data);
    }


    // 文件使用云存储 七牛云
    /**
     * 注册帐号
     * 查看密钥
     * 创建存储空间
     * 查阅使用文档
     *
     */
    // 将本地的文件上传到七牛云
    public function cloudStorage(){
        $accessKey = 'z6BH7AEcZltkZlff9E3Qtv7-LaRxZVnpjtCxo78H';// 放在配置文件里面
        $secretKey = 'CqkG-Lj4AD6TaNbh8qLqtuyDR41U1tX7yifQsMa-';
        $auth = new \Qiniu\Auth($accessKey, $secretKey);
        $bucket = '2002';
        // 生成上传Token
        $token = $auth->uploadToken($bucket);
        // 构建 UploadManager 对象
        $uploadMgr = new UploadManager();

        $file = \request()->file('file');
//        dd($file);
        $uploadName =  $file->getOriginalName();//上传后的文件名

        // 调用 UploadManager 的 putFile 方法进行文件的上传。
        list($ret, $err) = $uploadMgr->putFile($token, $uploadName, $file);
//        list() 将数组中的值赋值 PHP的内置函数
//        $result = $uploadMgr->putFile($token, $uploadName, $file);
//        $ret = $result[0];
//        $err = $result[1];
        echo "\n====> putFile result: \n";
        if ($err !== null) {
            var_dump($err);
        } else {
            var_dump($ret);
        }

    }

    /**
     * 删除云存储的文件
     */
    public function deleteCloud(){

        $accessKey = 'z6BH7AEcZltkZlff9E3Qtv7-LaRxZVnpjtCxo78H';// 放在配置文件里面
        $secretKey = 'CqkG-Lj4AD6TaNbh8qLqtuyDR41U1tX7yifQsMa-';
        $bucket = '2002';

        $key = "1597116297518964.png";// 删除的文件名
        $auth = new \Qiniu\Auth($accessKey, $secretKey);
        $config = new Config();
        $bucketManager = new BucketManager($auth, $config);
        $err = $bucketManager->delete($bucket, $key);
        if ($err) {
            print_r($err);
        }

    }
}
